// src/utils/index.ts
import axios, { AxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestHeaders } from 'axios';
import { message } from 'antd';
import { useNavigate } from 'react-router-dom';
// 判断地址栏上的地址是否是本地地址
const flag = window.location.hostname === 'localhost' || window.location.hostname === '192.168';

// 获取地址栏上的url
const getWindowUrl = window.location.protocol + '//' + window.location.hostname + '/frieneed-admin';
// 本地开发地址,默认地址
// const devlopmentUrl = 'https://neat-lamprey-strongly.ngrok-free.app/frieneed-admin';
const devlopmentUrl = 'https://api.mugua.co/frieneed-admin';
// 判断如果是本地地址，就使用devlopmentUrl，否则就获取地址栏上的地址
const baseURL = flag ? devlopmentUrl : getWindowUrl;

const service = axios.create({
    // baseURL: process.env.REACT_APP_API_BASE_URL || 'https://api.example.com', // 设置基础URL
    baseURL: devlopmentUrl || process.env.REACT_APP_API_BASE_URL, // 设置基础URL
    timeout: 5000, // 设置超时时间
    headers: {
        'Content-Type': 'application/json',
    },
});

// 请求拦截器
service.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        // 在发送请求之前做些什么
        const token = sessionStorage.getItem('frieneed-admin-satoken'); // 从本地存储获取token
        if (token) {
            (config.headers as AxiosRequestHeaders)['frieneed-admin-satoken'] = token;
        }
        (config.headers as AxiosRequestHeaders)['Accept-Language'] = 'en-US';
        return config;
    },
    (error: AxiosError) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        // 响应成功的处理
        const { code, data } = response.data;
        console.log(response, data);

        if (code == 200) {
            // 对响应数据做点什么
            return data;
        } else {
            message.error(response.data.message || 'Network anomaly');
        }
    },
    (error: AxiosError) => {
        const navigate = useNavigate();
        const logIn = () => {
            sessionStorage.clear();
            localStorage.clear();
            navigate('/login');
        };
        // 对响应错误做点什么
        if (error.response) {
            // const code = response.data.code;
            // 请求已发出但服务器响应的状态码不在 2xx 范围内
            switch (error.response.status) {
                case 90002:
                    message.error('Token is null');
                    logIn();
                    break;
                case 90003:
                    message.error('Invalid token');
                    logIn();
                    break;
                case 90004:
                    message.error('Token has expired');
                    logIn();
                    break;
                case 90006:
                    logIn();
                    break;
                case 90008:
                    message.error('Token has been topped offline');
                    logIn();
                    break;
                case 90009:
                    message.error('Token has been kicked offline');
                    logIn();
                    break;
                // case 401:
                //     // 处理未授权的情况
                //     console.error('Unauthorized, please login again');
                //     break;
                // case 403:
                //     // 处理禁止访问的情况
                //     console.error('Forbidden, you do not have access');
                //     break;
                // case 404:
                //     // 处理资源未找到的情况
                //     console.error('Resource not found');
                //     break;
                // case 500:
                //     // 处理服务器错误的情况
                //     console.error('Internal Server Error');
                //     break;
                default:
                    if (error.response.headers[`frieneed-admin-satoken`])
                        sessionStorage.setItem(
                            `frieneed-admin-satoken`,
                            error.response.headers[`frieneed-admin-satoken`]
                        );
                    return error.response;
            }
        } else if (error.request) {
            // 请求已发出但没有收到响应
            console.error('No response received:', error.request);
        } else {
            // 一些设置请求时发生错误
            console.error('Error setting up the request:', error.message);
        }
        return Promise.reject(error);
    }
);
export default service;
